package Perfil;

import Trab.ES1.Interface.Criacao;
import Trab.ES1.Modelos.*;
import Trab.ES1.Utilidades.Fachada;
import java.util.List;
import java.util.Scanner;

/**
 *
 * @author Grupo H
 */
public class PerfilUsuario extends Perfil
{
    private Usuario usuario;
    private Fachada fachada;
    public PerfilUsuario(Usuario u, boolean eDono)
    {
        super(u.getLogin(), eDono);        
        this.usuario = u;  
        fachada = Fachada.getInstancia();
    }
    
    public Usuario getUsuario()
    {
        return this.usuario;
    }

    @Override
    public void exibeOpcoes() 
    {
        int resp = 0;
        do
        {
            System.out.println("1-Visualizar receitas.\n2-Visualizar receitas favoritas.\n3-Visualizar grupos."
                + "\n4-Visualizar comentários do perfil\n5-Visualizar amigos");
            Scanner in = new Scanner(System.in);
            if(eDono)
                System.out.println("6-Editar\n7-Criar");
            System.out.println("8- Para sair");
            resp = in.nextInt();
            in.nextLine();
            switch(resp)
            {
                case 1:
                    visualizaReceitas(this.usuario.getReceitasEscritas());
                    break;
                case 2:
                    visualizaReceitas(this.usuario.getReceitasFavoritas());
                    break;
                case 3:
                    visualizaGrupos();
                    break;
                case 4:
                    visualizaComentarios();
                    break;
                case 5:
                    visualizaAmigos();
                    break;
                case 6:
                    if(eDono)
                        editaPerfil();
                    else
                        System.out.println("Opção inválida.");
                    break;
                case 7:
                    if(eDono)
                        cria();
                    else
                        System.out.println("Opção inválida.");
                    break;
                case 8:
                    break;
                default:
                    System.out.println("Opção inválida.");
            }
        }while(resp != 8);
    }  
    @Override
    public void exibeCabecalho()
    {
        System.out.println("------------------------------------------------------------------------------------");
        System.out.println("Bem vindo : " + usuario.getNomePublico());
        System.out.println("Sua classificação é : " + usuario.getClassificacao());
        System.out.println("------------------------------------------------------------------------------------");
    }
    private void visualizaReceitas(List<Receita> receitas)
    {
        for (Receita r : receitas)
        {
            new PerfilReceita(r,eDono).exibePerfil();
        }
    }
    private void visualizaGrupos()
    {
        for (Grupo g : this.usuario.getGruposPertencentes())
        {
            new PerfilGrupo(g,eDono).exibePerfil();
        }
    }
    private void visualizaComentarios()
    {
        for (Comentario c : this.usuario.getComentariosNoPerfil())
        {
            System.out.println("Autor: " + c.getAutor());
            System.out.println("Mensagem: " + c.getTexto());
        }
    }
    private void visualizaAmigos()
    {
        for (Usuario u : this.usuario.getAmigos()) 
        {
            new PerfilUsuario(u, false).exibePerfil();
        }
    }
    private void editaPerfil()
    {
        int resp = 0;
        do
        {
            System.out.println("1-Editar receitas.\n2-Editar grupos."
                + "\n3-Adicionar e remover amigos.\n4-Modificar senha\n5-Para sair");
            Scanner in = new Scanner(System.in);
            resp = in.nextInt();
            in.nextLine();
            switch(resp)
            {
                case 1:
                    editaReceita();
                    break;
                case 2:
                    editaGrupos();
                    break;
                case 3:
                    editaAmigos();
                    break;
                case 4:
                    modificaSenha();
                    break;
                case 5:
                    break;
                default:
                    System.out.println("Opção inválida.");
            }
        }while(resp != 5);
    }
    private void editaReceita()
    {
        Scanner in = new Scanner(System.in);
        String nomeInserido = "";
        Receita receitaAEditar = null;
        for (Receita r : this.usuario.getReceitasEscritas())
        {
            new PerfilReceita(r,eDono).exibePerfil();
        }
        do
        {
            System.out.println("Qual receita deseja editar? Digite o nome da receita ou SAIR para sair.");
            nomeInserido = in.nextLine();
            for (Receita r : this.usuario.getReceitasEscritas())
            {
                if(r.getNome().equalsIgnoreCase(nomeInserido))
                {
                    receitaAEditar = r;
                }
            }
            if(receitaAEditar != null)
            {
                new PerfilReceita(receitaAEditar, eDono).exibePerfil();
                receitaAEditar = null;
                System.out.println("Deseja editar outra receita? S/N");
                String resp = in.nextLine();
                while(!resp.equalsIgnoreCase("s") && !resp.equals("n"))
                {
                    System.out.println("Inválido. Digite S ou N.");
                    resp = in.nextLine();
                }
                if(resp.equalsIgnoreCase("n"))
                    break;
            }
            else
                System.out.println("Não existe receita com este nome.");
        }while(!nomeInserido.equalsIgnoreCase("sair"));
        
    }
    private void editaGrupos()
    {
        Scanner in = new Scanner(System.in);
        String nomeGrupo = "";
        PerfilGrupo grupo = null;
        for (Grupo g : this.usuario.getGruposNoQualEDono()) 
        {
            new PerfilGrupo(g, false).exibePerfil();
        }
        do
        {
            grupo = null;
            System.out.println("Digite o nome do grupo que deseja editar ou SAIR para sair.");
            nomeGrupo = in.nextLine();
            if(nomeGrupo.equalsIgnoreCase(""))
                System.out.println("O nome deve ser não vazio.");
            for (Grupo g : this.usuario.getGruposNoQualEDono()) 
            {
                if(g.getNome().equalsIgnoreCase(nomeGrupo))
                {
                    grupo = new PerfilGrupo(g, true);
                    grupo.exibePerfil();
                    break;
                }
            }
            if(grupo == null)
                System.out.println("Não existe grupo com esse nome.");
        }while(!nomeGrupo.equalsIgnoreCase("sair"));
    }
    private void editaAmigos()
    {
        Scanner in = new Scanner(System.in);
        for (Usuario u : this.usuario.getAmigos()) 
        {
            new PerfilUsuario(u, false).exibePerfil();
        }
        int resp = 0;
        do
        {
            System.out.println("1-Adicioanr amigo\n2-Remover amigo\n3-Para sair");
            resp = in.nextInt();
            in.nextLine();
            switch(resp)
            {
                case 1:
                    adicionaAmigo();
                    break;
                case 2:
                    removeAmigo();
                    break;
                case 3:
                    break;
                default:
                    System.out.println("Opção inválida.");
            }
                    
        }while(resp != 3);
    }
    private void adicionaAmigo()
    {
        Scanner in = new Scanner(System.in);
        String nomeAmigo = "";
        do
        {
            nomeAmigo = "";
            System.out.println("Digite o nome do amigo a ser adicionado ou SAIR para sair.");
            nomeAmigo = in.nextLine();
            if(nomeAmigo.equalsIgnoreCase(""))
                System.out.println("Nome deve ser não vazio.");
            else if(!nomeAmigo.equalsIgnoreCase("sair"))
            {
                if(fachada.verificaExistenciaUsuario(nomeAmigo) && !this.usuario.getAmigos().contains(fachada.buscaUsuario(nomeAmigo)))
                {
                    this.usuario.getAmigos().add(fachada.buscaUsuario(nomeAmigo));
                    System.out.println("Adicionado.");
                }
            }
        }while(!nomeAmigo.equalsIgnoreCase("sair"));
    }
    private void removeAmigo()
    {
        Scanner in = new Scanner(System.in);
        String nomeAmigo = "";
        do
        {
            nomeAmigo = "";
            System.out.println("Digite o nome do amigo a ser removido ou SAIR para sair.");
            nomeAmigo = in.nextLine();
            if(nomeAmigo.equalsIgnoreCase(""))
                System.out.println("Nome deve ser não vazio.");
            else
            {
                if(fachada.verificaExistenciaUsuario(nomeAmigo) && this.usuario.getAmigos().contains(fachada.buscaUsuario(nomeAmigo)))
                {
                    this.usuario.getAmigos().remove(fachada.buscaUsuario(nomeAmigo));
                    System.out.println("Removido.");
                }
            }
        }while(!nomeAmigo.equalsIgnoreCase("sair"));
    }
    private void modificaSenha()
    {
        fachada.modificaSenha(usuario.getLogin());
    }
    private void cria()
    {
        new Criacao(this.getUsuario());
    }
}
